package com.battery.system.service.battery;

import com.alibaba.fastjson.JSONObject;
import com.battery.common.core.domain.AjaxResult;
import com.battery.common.utils.BatteryJSONResult;
import com.battery.common.utils.ali.AliPayEntity;
import com.battery.system.domain.*;
import com.battery.system.domain.BO.UsedBO;
import com.battery.system.domain.VO.StatisticsVO;
import com.battery.system.domain.VO.UsedDetailVo;
import com.battery.system.domain.VO.UsedOrder;
import com.battery.system.domain.VO.UsedVO;
import com.battery.system.service.IBaseService;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 租借订单Service接口
 *
 * @author battery
 * @date 2021-01-22
 */
public interface IUsedService extends IBaseService<Used> {
    /**
     * 查询租借订单
     *
     * @param id 租借订单ID
     * @return 租借订单
     */
    public Used selectUsedById(String id);

    /**
     * 查询租借订单列表
     *
     * @param used 租借订单
     * @return 租借订单集合
     */
    public List<Used> selectUsedList(Used used);

    /**
     * 新增租借订单
     *
     * @param used 租借订单
     * @return 结果
     */
    public int insertUsed(Used used);

    /**
     * 修改租借订单
     *
     * @param used 租借订单
     * @return 结果
     */
    public int updateUsed(Used used);

    /**
     * 批量删除租借订单
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteUsedByIds(String ids);

    /**
     * 删除租借订单信息
     *
     * @param id 租借订单ID
     * @return 结果
     */
    public int deleteUsedById(String id);

    /**
     * 查询使用记录
     *
     * @param usedBO
     * @return
     */
    List<UsedVO> selectUsedVOList(UsedBO usedBO);

    /**
     * 根据用户ID查询正在进行中的订单（最新）
     *
     * @param appUserId
     * @return
     */
    List<Used> selectOnLoan(String appUserId);

    /**
     * 查询用户押金租借未支付的租借记录
     *
     * @param appUserId
     * @param channel
     * @param borrowMode
     * @return
     */
    Used selectOneNoPay(String appUserId, Integer channel, Integer borrowMode);

    /**
     * WS设备押金租借，方式2,（传统方式租借+强弹租借）
     *
     * @param noUsedDeposit 押金订单
     * @param appUser       用户信息
     * @param storeInstall  门店
     * @param device        设备信息
     * @return
     */
    BatteryJSONResult wsDevTips2DepositBorrowBattery(Order noUsedDeposit, AppUser appUser, StoreInstall storeInstall, Device device);

    /**
     * WS设备押金租借，方式一，（传统方式租借）
     *
     * @param noUsedDeposit
     * @param appUser
     * @param storeInstall
     * @param device
     * @return
     */
    BatteryJSONResult wsDevTips1DepositBorrowBattery(Order noUsedDeposit, AppUser appUser, StoreInstall storeInstall, Device device);

    /**
     * 线租借
     *
     * @param order   支付订单信息
     * @param appUser 用户信息
     * @param device  设备信息
     * @return
     */
    JSONObject lineBorrow(Order order, AppUser appUser, Device device);

    /**
     * 获取R_ 线密码
     *
     * @param deviceId
     * @param lineTime
     * @return
     */
    String getPwByNewLine(String deviceId, String lineTime);

    /**
     * 免押租借共享充电宝，--- （强弹方式租借+传统方式租借）
     *
     * @param authUsed     授权订单
     * @param appUser      用户信息
     * @param storeInstall 门店设置信息
     * @param device       设备信息
     * @return
     */
    BatteryJSONResult wsDevTips2FreeDepositBorrowBattery(AuthUsed authUsed, AppUser appUser, StoreInstall storeInstall, Device device);

    /**
     * 免押租借共享充电宝 --- (传统方式租借)
     *
     * @param authUsed
     * @param appUser
     * @param storeInstall
     * @param device
     * @return
     */
    BatteryJSONResult wsDevTips1FreeDepositBorrowBattery(AuthUsed authUsed, AppUser appUser, StoreInstall storeInstall, Device device);

    /**
     * WS设备根据归还消息结束订单
     *
     * @param used
     * @param entity
     * @return
     */
    BatteryJSONResult wsDevRequestEndUsed(Used used, AliPayEntity entity, JSONObject obj_);

    /**
     * 后台结束订单
     *
     * @param used
     * @param entity
     * @return
     */
    AjaxResult backstageEndUsed(Used used, AliPayEntity entity);


    List<UsedOrder> selectUsedOrderList(Map<String, String> map);

    List<UsedOrder> selectUsedDevOrderList(String devId);


    /**
     * 获取用户租借次数
     *
     * @param appUserId
     * @return
     */
    Integer selectBorrowCount(String appUserId);

    /**
     * 根据租借记录ID获取到对应的租借详情信息
     *
     * @param used_id
     * @return
     */
    UsedVO getUsedInfoById(String used_id);

    /**
     * 获取该用户最近一个月的租借订单信息 发起免押租借但未确认租借的订单不展示
     *
     * @param map
     * @return
     */
    List<UsedVO> selectListByMap(Map<String, Object> map);


    /**
     * 获取该用户最近一个月租借次数
     *
     * @param appUserId
     * @param lastMonth
     * @return
     */
    Integer selectCountLastMonth(String appUserId, Date lastMonth);


    /**
     * 获取该用户最近一个月租借订单数 发起免押租借但未确认租借的订单不展示
     *
     * @param map
     * @return
     */
    Integer selectListByMapCout(Map<String, Object> map);

    /**
     * 查询总营业收入
     *
     * @return
     */
    BigDecimal selectSuccessSum();

    /**
     * 查询租借订单数
     *
     * @return
     */
    Long selectSuccessCount();

    /**
     * 后台PC 图表数据
     *
     * @return
     */
    List<StatisticsVO> selectStatisticsVO();

    /**
     * 查询最近一个月营业额
     *
     * @return
     */
    BigDecimal selectSuccessSumByMouth();

    /**
     * 查询最近一个月的订单量
     *
     * @return
     */
    Long selectSuccessCountByMouth();

    /**
     * 根据该电池是否存在正在进行中的订单
     *
     * @param batterySn
     * @return
     */
    Used selectOneInProgressByBatterySn(String batterySn);


    List<IncomeTrend> selectIncomeByTrendDay(Map<String, String> map);

    List<IncomeTrend> selectIncomeByTrendMonth(Map<String, String> map);

    List<IncomeTrend> selectIncomeByTrendWeek(Map<String, String> map);


    /**
     * 查询该VIP用户今日已免费次数
     *
     * @param appUserId
     * @return
     */
    Integer selectCountByTodayFree(String appUserId);

    /**
     * VIP租借充电线
     *
     * @param appUser
     * @param device
     * @return
     */
    JSONObject lineVipBorrow(AppUser appUser, Device device, JSONObject meal);

    /**
     * 根据用户ID查询该用户正在租借中的订单个数
     *
     * @param appUserId
     * @return
     */
    int selectOnLoanCountByUid(String appUserId);

    /**
     * 收益统计中 ---- 订单量统计
     *
     * @param map
     * @return
     */
    Long selectCountByMap(Map<String, String> map);

    /**
     * 查询该门店的租借订单信息，已归还，且租借成功
     *
     * @param map
     * @return
     */
    List<Used> selectUsedListByApp(Map<String, String> map);

    /**
     * 展示租借详情记录
     *
     * @param id
     * @return
     */
    UsedDetailVo selectUsedDetails(String id);

    /**
     * 查询将近99元的租借订单 by one
     *
     * @return
     */
    Used selectOneInOnUsed();


    /**
     * 定时任务 结束99元订单
     *
     * @param used
     * @param costPrice
     * @param backDate
     * @param entity
     * @return
     */
    BatteryJSONResult taskEndDepositUsed(Used used, BigDecimal costPrice, Date backDate, AliPayEntity entity);

    /**
     * 查询处于初始状态的微信租借订单(最旧)
     *
     * @return
     */
    Used selectOneWxLeaseStateInInitialUsed();

    /**
     * 查询处于初始状态的支付宝租借订单(最旧)
     *
     * @return
     */
    Used selectOneAliLeaseStateInInitialUsed();
}
